package zwymap;

import java.util.HashMap;
import java.util.Hashtable;

import org.junit.Test;

public class HashMapTest01 {
	
	/**
	* 四个构造函数
	* @title: testConstruct 
	* @Author: zhaoweiyong
	* @Date: 2017年7月12日上午10:09:08
	 */
	@Test
	public void testConstruct(){
		//默认初始容量16
		//默认负载因子0.75
		HashMap<String, String> map = new HashMap<>();
		
		//指定初始容量
		map = new HashMap<>(16);
		
		//指定负载因子
		map = new HashMap<>(16, 0.75f);
		
		map = new HashMap<>(map);
		
		map.put(null, null);
		System.out.println(map.get(null));
		map.put(null, "1");
		System.out.println(map.get(null));
		
		//正如所说：不允许HashMap允许null value和null key , 但是HashTable不允许
		//以及Hashtable中的方法都是线程安全的方法 除此之外HashMap 和Hashtable没有什么不同
		Hashtable<String, String> table = new Hashtable<>();
		table.put("1", "1");
	}
	
	//返回最高位
	@Test
	public void testHighestOneBit(){
		//一个数如果为正，则它的原码、反码、补码相同
		//原码：00000000000000000000000000000111
		//反码：00000000000000000000000000000111
		//补码：00000000000000000000000000000111
		System.out.println(format(Integer.toBinaryString(7)));
		//原码：10000000000000000000000000000111
		//一个数如果为负(符号位不变化，其余位数取反)。
		//(反码加1就是补码)
		//反码：11111111111111111111111111111000
		//补码：11111111111111111111111111111001
		System.out.println(format(Integer.toBinaryString(-7)));
		//已知一个负数反码去求补码?
		int result = Integer.highestOneBit(31);
		System.out.println(result);
		System.out.println(95&15);
		System.out.println(30&15);
	}
	
	private String format(String binaryString) {
		StringBuffer sb = new StringBuffer();
		for(int i=binaryString.length();i<32;i++){
			sb.append("0");
		}
		return sb.toString() + binaryString;
	}

	@Test
	public void testPut(){
		//这里只是说明初始容量16 、 负载因子0.75
		//并有创建容纳数据的数组
		HashMap<String, String> map = new HashMap<>();
		for(int i=0;i < 50; i++){
			//第一次添加会开辟一个16个容量的数组
			//如果key为null
			map.put(String.valueOf(i), String.valueOf(i));
		}
		
		System.out.println(map);
		
	}
}
